還記得以前大學的時候,課堂上使用的是glut,當時很多地方都不清楚,只依稀記得底層是調用OpenGL 1.1的API,也就是固定管線(Fixed Function),簡言之,就是不能由開發者自己去編寫Shader,控制GPU要怎麼畫。可編程管線沒記錯是在3.0伴隨著GLSL 1.0才開始的。
可編程管線的版本的OpenGL,網路上最常看到的是用glew
或是glad
,雖說最開始用的是glew
,但就跟所有C與C++的lib一樣,對於初學,會需要一些linker、靜態和動態函式庫的知識,才可以正常的開始使用,用起來感覺很差,於是選用glad
,直接產一個header跟source,直接加入專案就好了,怎麼編譯都行!
其實還有另一個原因是,自學一些OpenGL時的教材是使用glad
,這個是連結
這個是我找到的簡中翻譯版本
事實上GLAD不是OpenGL的函式庫,比較像是產生器,選擇你要的OpenGL規格,然後產出文件。官方github就有提供連結,但我在這裡要使用的是更下面的glad2
,他會產出single-header file,如名,他只會有一個header,不會有另外一份放"實作(implementaion)"的*.c
文件。
點進這個連結後:
請在gl
那邊選OpenGL的版本,我這裡用的是GL3.3,最後下面點選header only,最後按下Generate。把.zip
下載下來,把gl.h
放到專案的exteranl
裡面,就完成一半了,我是在開一個glad
資料夾把gl.h
放在裡面。
再來就是驗證,有沒有安裝成功了,我們要再次請出glfw
的範例。
在Game Loop中一行:
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
這個是清除這個frame的color buffer,gl
開頭的就是調用OpenGL
的函式,為求方便驗證,再加上一行:
// 參數是浮點數,需要將RGBA的色碼轉換 [RGBA] / 255.0
glClearColor(r, g, b, a);
清除後,會換上新的背景顏色。
對了,就重要的是,要初始化GLAD
可以在iron_window.c
的地方加入#include "glad.h"
,然後在include之前#define GLAD_GL_IMPLEMENTATION
,像這樣:
#define GLAD_GL_IMPLEMENTATION
#include "glad.h"
然後在CreateWindow
那裏加上
// Init glad
if (!gladLoadGL(glfwGetProcAddress)) {
printf("Failed to load glad.");
return RES_ERROR_LOAD_GLAD;
}
就可以開始使用OpenGL的API了。
這個define是哪來的,各位可以打開gl.h
的第4040行,就可以看到single-header file,其實就是把實作放到header裡,然後用預處理器的指令把實作跟宣告隔開。
如果對single-header file有更多興趣的話,可以參考這位大大的github,FAQ那裏有更多說明,但是只有英文的。(>~<)
然後最後再按下按鈕就可以有一個你喜歡顏色的視窗對不對!
錯!!
在編譯到最後的時候,我的compiler顯示引用錯誤,看來專案其他地方也有實作了OpenGL。
把矛頭看相最可疑的glfw
,在glfw/deps/glad
下找到了,glfw
也有引用glad
,於是在查找官方文件後(找很久),找到了這一段,可以把glfw
的glad
停用,改用我們自己的,最後在include的地方(一樣是iron_window.c
)變成這樣...
#define GLFW_INCLUDE_NONE
#include "GLFW/glfw3.h"
#define GLAD_GL_IMPLEMENTATION
#include "glad/gl.h"
原本今天(2021/09/13)預計要畫出第一個三角形,結果卡在GLFW那個坑上面,但這也很貼近程式設計師的的日常工作會發生的事,計畫敢不上變化,原本預計花N個小時解決這個問題,結果衍生處更多問題 (QAQ)。
已經有預感會有更多坑惹,不然怎麼叫挑戰呢。(ˊ_>ˋ)